#include "fenetreconnexion.h"

FenetreConnexion::FenetreConnexion(QWidget *parent)
    : QDialog(parent)
{
    // On met en place l'interface graphique
    setupUi();

    // Retourne la liste des drivers sous forme de QList<String>
    QStringList drivers = QSqlDatabase::drivers();

    // supprime les noms compatibles (ex: pour ODBC3, choisir ODBC...)
    drivers.removeAll("QMYSQL3");
    drivers.removeAll("QOCI8");
    drivers.removeAll("QODBC3");
    drivers.removeAll("QPSQL7");
    drivers.removeAll("QTDS7");

    // Si le driver QSQLITE est présent
    if (!drivers.contains("QSQLITE"))
    {
        // On active la checkbox permettant de créer une bdd prédéfinie
        cbBddPredefinie->setEnabled(false);
    }

    // On remplit la combobox avec les drivers
    comboDriver->addItems(drivers);
}

/*
 * Slot déclenché à l'affichage de la fenêtre, permet de la centrer sur l'écran
 */
void FenetreConnexion::showEvent(QShowEvent *)
{
    QDesktopWidget desktop;
    move(desktop.availableGeometry(this).width()/2 - width()/2, desktop.availableGeometry(this).height()/2 - height()/2);
}

/*
 * Méthode contenant l'instantiation et la configuration de tous les éléments graphiques
 */
void FenetreConnexion::setupUi()
{
    // Définit le nom de la fenêtre
    setWindowTitle("Connexion...");

    connGroupBox = new QGroupBox("Configuration de connexion");
    comboDriver = new QComboBox;

    editDatabase = new QLineEdit;

    portSpinBox = new QSpinBox;
    portSpinBox->setSpecialValueText("Default");
    portSpinBox->setRange(0, 100000);

    editPassword = new QLineEdit;
    editPassword->setEchoMode(QLineEdit::Password);
    editUsername = new QLineEdit;
    editHostname = new QLineEdit;

    formLayout = new QFormLayout;
    formLayout->addRow("Driver", comboDriver);
    formLayout->addRow("Database Name:", editDatabase);
    formLayout->addRow("Username:", editUsername);
    formLayout->addRow("Password:", editPassword);
    formLayout->addRow("Hostname:", editHostname);
    formLayout->addRow("Port:", portSpinBox);
    connGroupBox->setLayout(formLayout);

    // Ajout d'espace pour mettre les widgets à droite de la fenêtre
    spacer1 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
    spacer2 = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

    okButton = new QPushButton("OK");
    okButton->setDefault(true);
    cancelButton = new QPushButton("Annuler");

    cbBddPredefinie = new QCheckBox("Utiliser la base de données prédéfinie");

    hbBddPredefinie = new QHBoxLayout();
    hbBddPredefinie->addItem(spacer1);
    hbBddPredefinie->addWidget(cbBddPredefinie);

    hbButton = new QHBoxLayout();
    hbButton->addItem(spacer2);
    hbButton->addWidget(okButton);
    hbButton->addWidget(cancelButton);

    vbPrincipale = new QVBoxLayout();
    vbPrincipale->addWidget(connGroupBox);
    vbPrincipale->addLayout(hbBddPredefinie);
    vbPrincipale->addLayout(hbButton);

    setLayout(vbPrincipale);

    // Connexion SIGNAL/SLOT
    QObject::connect(cancelButton, SIGNAL(clicked()), this, SLOT(on_cancelButton_clicked()));
    QObject::connect(cbBddPredefinie, SIGNAL(clicked()), this, SLOT(on_cbBddPredefinie_clicked()));
    QObject::connect(okButton, SIGNAL(clicked()), this, SLOT(on_okButton_clicked()));

    // Permet d'établir l'ordre de navigation lors de l'appuie sur la touche tab
    setTabOrder(comboDriver, editDatabase);
    setTabOrder(editDatabase, editUsername);
    setTabOrder(editUsername, editPassword);
    setTabOrder(editPassword, editHostname);
    setTabOrder(editHostname, portSpinBox);
    setTabOrder(portSpinBox, cbBddPredefinie);
    setTabOrder(cbBddPredefinie, okButton);
    setTabOrder(okButton, cancelButton);
}

/*
 * Retourne le nom du driver sélectionné dans la combobox
 */
QString FenetreConnexion::driverName() const
{
    return comboDriver->currentText();
}

/*
 * Retourne le nom de la base de données
 */
QString FenetreConnexion::databaseName() const
{
    return editDatabase->text();
}

/*
 * Retourne le nom de l'utilisateur
 */
QString FenetreConnexion::userName() const
{
    return editUsername->text();
}

/*
 * Retourne le mot de passe
 */
QString FenetreConnexion::password() const
{
    return editPassword->text();
}

/*
 * Retourne le nom d'hôte
 */
QString FenetreConnexion::hostName() const
{
    return editHostname->text();
}

/*
 * retourne le numéro de port
 */
int FenetreConnexion::port() const
{
    return portSpinBox->value();
}

/*
 * Retourne true si l'utilisateur veut utiliser la base de données prédéfinie
 */
bool FenetreConnexion::utiliseDBPredefinie() const
{
    return cbBddPredefinie->isChecked();
}

/*
 * Slot déclenché après le clic sur le bouton Ok
 */
void FenetreConnexion::on_okButton_clicked()
{
    // Si aucun driver n'a été sélectionné
    if (comboDriver->currentText().isEmpty())
    {
        // On affiche une messageBox
        QMessageBox::information(this, "Pas de driver sélectionné", "Veuillez sélectionner un driver de base de données.");
        // On met la comboxBox en sélection
        comboDriver->setFocus();
    }
    else
    {
        // Ferme la fenêtre et retourne la valeur "Accepted"
        accept();
    }
}
